package com.ques.utils;

import com.swetake.util.Qrcode;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.OutputStream;

/**
 * @author zq  2020-02-12
 */
public class QRCodeUtil {
    /**
     * 加密：  文字信息 ->二维码.png
     * imgPath：src/二维码.png
     * content:  文字信息
     * imgType：png
     */
    public static void encoderQRCode(String content,  OutputStream outputStream   , String logoPath, String imgType, int size) throws Exception {
        //BufferedImage ：内存中的一张图片
        BufferedImage bufImg = qRcodeCommon(content, imgType, size ,logoPath);
        // "src/二维码.png" --> 二维码.png
        //生成图片

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ImageIO.write(bufImg,imgType ,baos) ;
        baos.flush();
        byte[] bytes = baos.toByteArray();
        baos.close();
        outputStream.write(bytes );
        outputStream.flush();
        outputStream.close();
    }

    /**
     * 产生一个二维码的BufferedImage
     * content:二维码中隐藏的信息
     * imgType:图片格式
     * size :二维码边长
     */
    private static BufferedImage qRcodeCommon(String content, String imgType, int size , String logoPath) throws Exception {
        BufferedImage bufImg = null;
        //Qrcode对象：字符串->boolean[][]
        Qrcode qrCodeHandler = new Qrcode();
        //设置二维码的排错率：7% L<M<Q<H30%  ：排错率越高,可存储的信息越少；但是对二维码清晰对要求越小
        qrCodeHandler.setQrcodeErrorCorrect('M');
        //可存放的信息类型：N：数字、  A：数字+A-Z  B：所有
        qrCodeHandler.setQrcodeEncodeMode('B');
        //尺寸：取值范围：1-40
        qrCodeHandler.setQrcodeVersion(size);

        //"Hello world" -> byte[]"Hello world"
        byte[] contentBytes = content.getBytes("UTF-8");
        //  -->boolean[][]
        boolean[][] codeOut = qrCodeHandler.calQrcode(contentBytes);

        int imgSize = 67 + 12 * (size - 1);

        //BufferedImage：内存中的图片
        //red green blue
        bufImg = new BufferedImage(imgSize, imgSize, BufferedImage.TYPE_INT_RGB);

        //创建一个画板
        Graphics2D gs = bufImg.createGraphics();

        //将画板的背景色设置为白色
        gs.setBackground(Color.WHITE);
        //初始化
        gs.clearRect(0, 0, imgSize, imgSize);
        //设置 画板上 图像的颜色（二维码的颜色）
        gs.setColor(Color.BLACK);
        int pixoff = 2;

        for (int j = 0; j < codeOut.length; j++) {
            for (int i = 0; i < codeOut.length; i++) {
                if (codeOut[j][i]) {
                    gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);
                }
            }
        }
        //增加LOGO
        //将硬盘中的src/logo.png  加载为一个Image对象
        Image logo = ImageIO.read(new File( logoPath));
        int maxHeight = bufImg.getHeight();
        int maxWdith = bufImg.getWidth();

        //在已生成的二维码上 画logo
        gs.drawImage(logo, imgSize / 5 * 2, imgSize / 5 * 2, maxWdith / 5, maxHeight / 5, null);

        gs.dispose(); //释放空间
        bufImg.flush(); //清理
        return bufImg;
    }

    public static void main(String[] args) throws Exception {
        QRCodeUtil qrCodeUtil = new QRCodeUtil();
        String basePath = QRCodeUtil.class.getResource("/").getPath() ;
//
        String filname =basePath + "1.png";
        String logoPath = basePath+ "logo.png" ;

//        File file = new File(logoPath);
//        boolean exists = file.exists();
//        System.out.println(exists);
//        System.out.println(filname);
//        System.out.println(logoPath);
//        qrCodeUtil.encoderQRCode("http://localhost:8080/ques/5e2aa3101139a9222c9824fe.html", filname,logoPath , "png", 17 );
    }
}
